package me.youline.dataServer.service.image;

import java.io.File;
import java.util.List;

import me.youline.dataServer.service.support.config.ImageSizeConfig;

import com.google.common.collect.Lists;

/**
 * 默认图片略缩上下文
 * @author linhan
 *
 */
public class DefaultImageScaleContext implements ImageScaleContext {

	/**
	 * 执行略缩的原图
	 */
	private File sourceFile;

	/**
	 * 图片尺寸配置
	 */
	private ImageSizeConfig sizeConfig;

	/**
	 * 需要执行略缩操作的指定尺寸集合
	 */
	private List<ImageSize> scaleSizes;

	/**
	 * 文件名格式定义
	 */
	private static String FILE_NAME_FORMAT = "%s[%s]";

	/**
	 * 源文件名称
	 */
	private String sourceFileName;

	private DefaultImageScaleContext(File sourceFile) {
		this.sourceFile = sourceFile;
		this.sourceFileName = this.sourceFile.getName();
	}

	/**
	 * 创建平台图片尺寸配置的略缩上下文
	 * @param sourceFile
	 * @param config
	 */
	public DefaultImageScaleContext(File sourceFile, ImageSizeConfig config) {
		this(sourceFile);
		this.sizeConfig = config;
	}

	/** 
	 * 创建指定略缩图片尺寸的上下文
	 * @param sourceFile
	 * @param scaleSize
	 */
	public DefaultImageScaleContext(File sourceFile, ImageSize scaleSize) {
		this(sourceFile);
		this.scaleSizes = Lists.newArrayList(scaleSize);
	}

	/**
	 * 创建指定批量略缩图尺寸的上下文
	 * @param sourceFile
	 * @param scaleSizes
	 */
	public DefaultImageScaleContext(File sourceFile, List<ImageSize> scaleSizes) {
		this(sourceFile);
		if(scaleSizes == null || scaleSizes.isEmpty()){
			throw new RuntimeException("不符合要求的略缩上下文，请指定略缩尺寸");
		}
		this.scaleSizes = Lists.newArrayList(scaleSizes);
	}

	@Override
	public File getSourceFile() {
		return this.sourceFile;
	}

	@Override
	public List<ImageSize> getScaleSizes() {
		if (scaleSizes != null) {
			return scaleSizes;
		}
		return sizeConfig.getAllImageSize();
	}

	@Override
	public File getTargetFile(ImageSize size) {
		String path = sourceFile.getParent();
		String fileName = String.format(FILE_NAME_FORMAT,
				this.getSourceFileName(), size.getSizeFormatStr());
		return new File(path + File.separatorChar + fileName);
	}

	protected String getSourceFileName() {
		return sourceFileName;
	}

}
